/* CoralCube | Massively Multiplayer Online Role-Playing Game(MMORPG) Emulator.
|* 
|* Copyright (C) 2005-2010 MaNGOS <http://getmangos.com/>
|*               2008-2010 TrinityCore <http://www.trinitycore.org/>
|*               2008-2010 CoralCube <http://www.CoralCube.com/>
|*
|* This program is free software. You can redistribute it and/or modify it under the terms of 
|* the GNU General Public License as published by the Free Software Foundation, either 
|* version 2 of the License.
|*
|* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY, 
|* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
|* See the GNU General Public License for more details.
|*
|* You should have received a copy of the GNU General Public License along with this program. 
|* If not, see <http://www.gnu.org/licenses/>.
|*/

#ifndef TRINITY_GAMEOBJECTAI_H
#define TRINITY_GAMEOBJECTAI_H

#include "Define.h"
#include <list>
#include "Object.h"
#include "GameObject.h"
#include "CreatureAI.h"

class GameObjectAI
{
protected:
    GameObject * const go;
public:
    explicit GameObjectAI(GameObject *g) : go(g) { }
    virtual ~GameObjectAI() { }

    virtual void UpdateAI(const uint32 /*diff*/) { }

    virtual void InitializeAI() { Reset(); }

    virtual void Reset() { };

    // Pass parameters between AI
    virtual void DoAction(const int32 /*param*/ = 0) {}
    virtual uint32 GetData(uint32 /*id = 0*/) { return 0; }
    virtual void SetGUID(const uint64 &/*guid*/, int32 /*id*/ = 0) {}
    virtual uint64 GetGUID(int32 /*id*/ = 0) { return 0; }

    static int Permissible(const GameObject* go);

    virtual bool GossipHello(Player* player) {return false;}
    virtual bool GossipSelect(Player* player, uint32 sender, uint32 action) {return false;}
    virtual bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) {return false;}
    virtual bool QuestAccept(Player* player, Quest const* quest) {return false;}
    virtual bool QuestReward(Player* player, Quest const* quest, uint32 opt) {return false;}
    virtual uint32 GetDialogStatus(Player* /*player*/) {return 100;}
    virtual void Destroyed(Player* player, uint32 eventId) {}
    virtual void SetData(uint32 id, uint32 value) {}
};

class NullGameObjectAI : public GameObjectAI
{
public:
    explicit NullGameObjectAI(GameObject *g);

    void UpdateAI(const uint32 /*diff*/) { }

    static int Permissible(const GameObject* /*go*/) { return PERMIT_BASE_IDLE; }
};
#endif
